/**
 * 
 */
package cc.dogtailflower.framework.handler;

import java.lang.reflect.Field;
import java.util.Map;

import cc.dogtailflower.framework.annotation.Autowired;
import cc.dogtailflower.framework.util.ArrayUtil;
import cc.dogtailflower.framework.util.CollectionUtil;
import cc.dogtailflower.framework.util.ReflectionUtil;

/**
 * 类似spring的依赖注入功能！
 * 获取所有的实例，通过反射获取实例中的所有成员变量，看成员变量是否带有@Autowired注解，如果有，则通过反射获取，初始化该成员变量，为其set对象，该对象已经在集合中，所以集合中的对象都是单例的！
 * @author cc
 *
 */
public class IocHandler {
	
	/*
	 * 初始化所有带有Autowired注解的成员变量
	 */
	static{
		//首先获取所有的类和实例的映射集合
		Map<Class<?>,Object> classBeanMap = BeanHandler.getClassBeanMap();
		if(CollectionUtil.isNotEmpty(classBeanMap)){
			for(Map.Entry<Class<?>,Object> classBeanEntry : classBeanMap.entrySet()){
				Class<?> beanClass = classBeanEntry.getKey();
				Object beanInstance = classBeanEntry.getValue();
				//反射获取beanClass所有的成员变量
				Field[] beanFields = beanClass.getDeclaredFields();
				if(ArrayUtil.isNotEmpty(beanFields)){
					for(Field beanField : beanFields){
						//如果该成员变量被@Autowired注解修饰
						if(beanField.isAnnotationPresent(Autowired.class)){
							//从集合中获取该bean实例
							Class<?> beanFieldClass = beanField.getType();
							Object beanFieldInstance = classBeanMap.get(beanFieldClass);
							//通过反射set方法给该成员变量赋值
							ReflectionUtil.setField(beanInstance, beanField, beanFieldInstance);
						}
					}
				}
			}
		}
	}
}
